package com.solo.common.orm.core.query.anno;

import com.mybatisflex.core.table.TableDef;
import com.solo.common.orm.core.query.enums.ColumnStyle;

import java.lang.annotation.*;

/**
 * 查询条件包装注解, 作用于查询实体类上
 * <pre>
 *     别名优先级：{@link #alias()} > {@link #table()} > {@link QueryTable#alias()} > {@link QueryTable#table()}
 * <pre/>
 * @author 十一
 * @since 2023/09/19 09:16
 * 人生若只如初见，何事秋风悲画扇
 **/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Inherited
public @interface QueryTable {

    /**
     * 列风格, 默认为 驼峰属性 转换为 下划线字段。<br>
     * 例如：
     * <pre>{@code
     * HelloWorld=》hello_world
     * Hello_World=》hello_world
     * HelloWorld_test=》hello_world_test
     * }</pre>
     */
    ColumnStyle style() default ColumnStyle.camel_to_underline;

    /**
     * 表定义
     */
    Class<? extends TableDef> table();

    /**
     * 表名别名, 默认为空，
     * <pre>
     * 当为空时，则使用{@link #table }作为别名
     * 不为空时，则使用本字段作为别名
     * </pre>
     */
    String alias() default "";

    // =====================排序相关 start=============================
    
    // TODO 是否考虑将此处优化成可以根据多个字段进行排序，暂时先搁置

    /**
     * 排序列, 默认为空
     */
    String orderBy() default "";

    /**
     * 是否升序, 默认降序
     */
    boolean asc() default false;

    // =====================排序相关 start=============================
    
    // =====================数据权限相关 start=============================

    /**
     * 是否启用数据权限注解, 默认不启用
     */
    boolean dataScope() default false;

    /**
     * 用户别名，配合{@link #userIdColumn }一块使用，默认为空。<br/>
     * <pre>
     * 当为空时，默认使用{@link #alias }当做别名
     * 不为空时，则使用本字段作为别名
     * </pre>
     * <p>特别注意：该字段仅当数据源和system模块数据源一致时可用。<br/>
     * 不一致时请勿使用，请在指定表下增加{@link #userIdColumn }列</p>
     * <p>案例详见：{@link com.solo.system.web.SysRoleController#page}</p>
     */
    String userAlias() default "";

    /**
     * 用户id列（当权限为仅自己时，sql所拼接的查询字段，默认使用create_by）
     */
    String userIdColumn() default "create_by";

    /**
     * 部门别名，配合{@link #deptIdColumn }一块使用，默认为空。<br/>
     * <pre>
     * 当为空时，默认使用{@link #alias }当做别名
     * 不为空时，则使用本字段作为别名
     * </pre>
     * <p>特别注意：该字段仅当数据源和system模块数据源一致时可用。<br/>
     * 不一致时请勿使用，请在指定表下增加{@link #deptIdColumn }列</p>
     * <p>案例详见：{@link com.solo.system.web.SysRoleController#page}</p>
     */
    String deptAlias() default "";
    
    /**
     * 部门id列（当权限为部门、部门及以下、自定义时，sql所拼接的查询字段，默认使用dept_id）
     */
    String deptIdColumn() default "dept_id";

    // =====================数据权限相关 end=============================

}
